먼저 [[JavaScript - this]]를 알아보자.
👀 더 자세한 내용은 [[JavaScript - Scope]], [[JavaScript - Closure]]를 참조한다.
function foo() {
return this // undefined in strict mode
}
위와 같은 함수를 strict mode에서 그냥 호출하면 this
에 아무것도 set하지 않았으므로 undefined
를 반환한다.
// 이어서...
const bar = {
z: 1;
}
foo.call(bar); // bar 객체를 참조, 바로 실행 -> bar를 반환
foo.apply(bar); // bar 객체를 참조, 바로 실행 -> bar를 반환
const foobind = foo.bind(bar); // bar를 this로 참조하는 새로운 foo 함수 반환
call
, 과 apply
의 차이점은 함수 호출시 인자를 어떤 형태로 넘기느냐이다.
func.call(this, 1,2,3,4)
func.apply(this, [1, 2, 3, 4, 5])
this
를 참조하는 새로운 함수를 반환func.bind(this)
부분 적용 함수를 만들 때 사용한다. 이게 무엇이냐. 어떤 함수의 인자 값 일부를 고정한 함수를 새로 만드는 것이다.
function addNumbers(a, b) {
return a + b
}
const addTwo = addNumbers.bind(null, 2)
console.log(addTwo(3)) // 5
정확히는 함수내에서 원하는 this
를 정확히 참조하고 싶을 때 사용한다.
setTimeout()
와 같은 전역 함수는 이미this
가 window
와 같은 전역 객체를 참조한다.
그렇기 때문에 클래스 안에서 호출하더라도 클래스 인스턴스가 this
로 참조되지 않는다.
이럴 때 인스턴스를 bind한 함수를 만들어 전달하면 된다.